package com.cy.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import javax.annotation.Resource;

@RestController
class ConController {
    /*
    * 负载均衡客户端对象
    *
    * */
    @Autowired
    private LoadBalancerClient loadBalancerClient;

    @Resource //这里并不用@Autowired 而是用@Resource  https://blog.csdn.net/yiye2017zhangmu/article/details/97618748/
    private RestTemplate restTemplate;
    //首先要spring容器中是否有与属性或方法参数类型相匹配的对象，假如有并且只有一个则直接注入。（先查找类型相同的）
    //其次，假如检测到有多个，还会按照@Autowired描述的属性或方法参数名查找是否有名字匹配的对象，有则直接注入，没有则抛出异常。（在查找名字相同的）
    //loadBalance这个名字和ConsumerApp.java中的RestTemplate loadBalance()方法同名
    @Autowired
    private RestTemplate loadBalance;

    @Value("${spring.application.name}")
    private String appName;

    @GetMapping("/consumer/echo")
    public String doRestEcho(){
        System.out.println("---restTemplate()---");
        //调用服务提供方API(http://ip:port/path) --- 没错，url地址也可以是API
        //1.定义要调用的API
        String url="http://localhost:8081/provider/echo/"+appName;
        //2.谁去访问API？
        return restTemplate.getForObject(url, String.class);
    }
    /* 负载均衡案例 */
    @GetMapping("/consumer/echo2")
    public String doRestEcho2(){
        //调用服务提供方API(http://ip:port/path) --- 没错，url地址也可以是API
        //1.获取服务实例
        ServiceInstance instance = loadBalancerClient.choose("sce-provider");
        //2.基于RestTemplate进行服务实例对象
        String ip = instance.getHost();//拿到ip地址
        int port = instance.getPort();//获取端口号
        //测试负载均衡，端口号会来回变动，因此url不能写死了
        //String url = "http://"+ip+":"+port+"/provider/echo/"+appName;
        // %s --- 这是占位符
        // 后面依次填入
        String url = String.format("http://%s:%s/provider/echo/%s",ip,port,appName);
        return restTemplate.getForObject(url,String.class);
    }

    @GetMapping("/consumer/doRestEcho3")
    public String doRestEcho3(){
        //定义url
        String serviceId="sca-provider";//服务名
        String url=String.format("http://%s/provider/echo/%s",serviceId,appName);
        //服务调用
        return loadBalance.getForObject(url, String.class);
    }
}